/**
 * 简答题
 */

// 一、
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function() {
    console.log(i);
  }
}
a[6]()

// 10
// 解答： for循环不是一个函数体，不存在相应的函数作用域，同时var声明的变量也不存在作用域，也就是说var和arr处于同一作用域，每次i++ ，作用的也是同一个i
// 故a[6]()是最终的结果10

// 二
var tmp = 123;
if(true) {
  console.log(tmp);
  let tmp
}

// Cannot access 'tmp' before initialization
// 解答：因为let声明的变量会形成一个块级作用域，同时let声明的变量在调用的时候不能提前，
// 所以在if作用域内先调用tmp是不正确的。

// 三
var arr = [12, 34, 32, 89, 4];
var result = arr.sort((a, b) => a - b)
console.log(result[0])
// 4

// 四：说明var, let, const 三种声明变量方式之间的具体差别
// 解答：1、var只有全局作用域和函数作用，没有块级作用域，let有块级作用域，由{}包裹起来；
// 2、var和let在变量声明之前就调用，var是undefined，而let会提示ReferenceError错误，var声明的变成存在变量提升，而let和const必须在声明之后调用
// 3、const声明的变量如果是基本数据类型，比如：数字，字符串，boolean，赋值以后不可再更改，如果是引用数据类型，比如：数组、对象，赋值以后可以再修改，
// 这是因为const变量指向的是内存地址，保存的是一个指针，

// 五
var a = 10;

var obj ={
  a: 20,
  fn() {
    setTimeout(() => {
      console.log(this.a);
    })
  }
}

obj.fn()
// 20

// 解答：this始终指向最终调用它的函数，所以this指向obj，obj.a = 20

// 六：简述Symbol类型的用途
// 解答：
// 1、定义常量
// 2、对应对象的键
// 3、定义类的私有属性或者方法

// 七：什么是浅拷贝，什么是深拷贝
// 解答：
// 浅拷贝：只是复制对象的指针，不复制对象本身，还是共享一块内容，当一个对象修改，另一个也会跟着改变
// 深拷贝：复制一个一模一样的对象，不共享内存空间，修改新对象，旧对象不会改变
// 常用浅拷贝的方法Object.assign(), es6的...
// 常用深拷贝的方法是JSON.parse(JSON.stringfiy())


// 八、简述Typescript和Javascript的关系
// 解答：TypeScript是JavaScript类型的超类，它可以编译成纯JavaScript。


// 九、Typescript优缺点
// 解答:

// 优点：
// 静态类型化，允许开发人员编写更健壮的代码并对其进行维护。
// TypeScript增加了静态类型、类、模块、接口和类型注解.
// TypeScript通过类型注解提供编译时的静态类型检查。
// TypeScript中的数据要求带有明确的类.

// 缺点
// 学习成本高，需要理解静态类型、类、模块、接口和类型注解使用方法
// 需要构建工具将TS编译成JS

// 十、描述引用计数的工作原理和优缺点
// 解答
// 当声明了一个变量并将一个引用类型值赋给该变量时，这个值的引用次数就是 1。如果同一个值又被赋值给另一个变量，则引用次数加 1。
// 相反，如果包含对这个值的引用的变量有取了另一个值，则引用次数减 1。当这个值的引用次数变为 0 时，说明已经没法再访问这个值了，因此可以将其占用的内存回收了

// 优缺点：
// 可以及时回收垃圾对象
// 减少程序卡顿时间
// 无法回收循环引用的对象
// 资源消耗较大

// 十一、描述标记整理算法的工作流程
// 解答:
// 1、标记所有可达对象，
// 2、回收所有不可达对象
// 3、整理释放的内存空间

// 十二、V8中新生代存储区垃圾回收的流程
// 解答：
// 回收过程采用复制算法+标记整理
// 新生代内存区分为二个等大小空间
// 使用空间为From，空闲空间为To
// 活动对象存储于From空间
// 标记整理后将活动对象拷贝至To
// From与To交换空间完成释放

// 十三、表述增量标记算法在何时使用及工作原理
// 解答：
// 增量标记是在标记整理以后使用。
// 增量标记是将一整段垃圾回收拆分成若干部分组合的进行垃圾回收，来替代之间一口气做完的垃圾回收，这样做的好处是让垃圾回收和程序执行去交替着执行